"""
依赖注入（DI）核心模块

此模块提供了 Axiom Boot 框架的依赖注入功能，其设计深受 Spring 框架的启发。
它允许开发者通过装饰器定义和注入服务，实现了控制反转（IoC）。
"""

from typing import Any, Callable, Optional, Type


class Autowired:
    """
    一个描述符类，用于标记需要自动注入的依赖项。

    当作为类属性使用时，它充当一个占位符，DI 容器在实例化服务时
    会用实际的依赖项实例替换它。

    示例:
        class MyService:
            another_service: AnotherService = autowired()
    """
    def __init__(self, dependency: Optional[Any] = None):
        self.dependency = dependency


def autowired(dependency: Optional[Any] = None) -> Any:
    """
    工厂函数，用于创建 Autowired 实例。

    Args:
        dependency: 要注入的依赖的类型或名称。如果为 None，将根据字段的类型注解推断。

    Returns:
        一个 Autowired 实例。
    """
    return Autowired(dependency)


class ServiceDefinition:
    """
    封装了一个服务的所有元数据。

    包括服务的名称、目标（类或工厂函数）、是否是主候选项以及其提供的类型。
    """
    def __init__(
        self,
        name: str,
        target: Callable,
        is_primary: bool = False,
        provides: Optional[Type] = None,
    ):
        self.name = name
        self.target = target
        self.is_primary = is_primary
        self.provides = provides 